public class Math16 extends Processor {
    static int 
	aLo, aHi, 
	bLo, bHi, // result after division
	cLo, cHi, // reminder after division
	dLo, dHi,
	temp, flags;


    static void add() {
	_asm("  bcf	Math16_flags,_C");
	_asm("	movf    Math16_aLo,0");
	_asm("	addwf   Math16_bLo,1");
	_asm("	btfsc   _STATUS,_C");
	_asm(" 	incf    Math16_bHi,1");
	_asm("	btfsc	_STATUS,_C");
	_asm("	bsf	Math16_flags,_C");
	_asm("	movf    Math16_bHi,0");
	_asm("	addwf   Math16_bHi,1");
	_asm("	btfsc	Math16_flags,_C");
	_asm("	bsf	_STATUS,_C");
    }

    static void mul() {
	_asm("	call    Math16_setup__V");
	_asm("Math16_mloop   rrf     Math16_dHi,1");
	_asm("	rrf     Math16_dLo,1");
	_asm("	btfsc   _STATUS,_C");
	_asm("	call    Math16_add__V");
	_asm("	rrf     Math16_bHi,1");
	_asm("	rrf     Math16_bLo,1");
	_asm("	rrf     Math16_cHi,1");
	_asm("	rrf     Math16_cLo,1");
	_asm("	decfsz  Math16_temp,1");
	_asm("	goto    Math16_mloop");
    }

    static void setup() {
	_asm("  movlw   16");
	_asm("	movwf   Math16_temp");
	_asm("	movf    Math16_bHi,0");
	_asm("	movwf   Math16_dHi");
	_asm("	movf    Math16_bLo,0");
	_asm("	movwf   Math16_dLo");
	_asm("	clrf    Math16_bHi");
	_asm("	clrf    Math16_bLo");
    }

    static void div() {
	_asm("	call    Math16_setup__V");
	_asm("	clrf    Math16_cHi");
	_asm("	clrf    Math16_cLo");
	_asm("Math16_dloop   bcf     _STATUS,_C");
	_asm("	rlf     Math16_dLo,1");
	_asm("	rlf     Math16_dHi,1");
	_asm("	rlf     Math16_cLo,1");
	_asm("	rlf     Math16_cHi,1");
	_asm("	movf    Math16_aHi,0");
	_asm("	subwf   Math16_cHi,0");
	_asm("	btfss   _STATUS,_Z");
	_asm("	goto    Math16_nochk");
	_asm("	movf    Math16_aLo,0");
	_asm("	subwf   Math16_cLo,0");
	_asm("Math16_nochk   btfss   _STATUS,_C");
	_asm("	goto    Math16_nogo");
	_asm("	movf    Math16_aLo,0");
	_asm("	subwf   Math16_cLo,1");
	_asm("	btfss   _STATUS,_C");
	_asm("	decf    Math16_cHi,1");
	_asm("	movf    Math16_aHi,0");
	_asm("	subwf   Math16_cHi,1");
	_asm("	bsf     _STATUS,_C");
	_asm("Math16_nogo    rlf     Math16_bLo,1");
        _asm("	rlf     Math16_bHi,1");
	_asm("	decfsz  Math16_temp,1");
	_asm("	goto    Math16_dloop");
    }
}
